package dao

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"gopkg.in/yaml.v3"
	"io/ioutil"
)

// 数据库驱动常量
const DRIVER = "mysql"

var SqlSession *gorm.DB

// 配置结构体
type conf struct {
	DB struct {
		Type     string `yaml:"type"`
		Host     string `yaml:"host"`
		UserName string `yaml:"userName"`
		Password string `yaml:"password"`
		DbName   string `yaml:"dbname"`
		Port     string `yaml:"port"`
	} `yaml:"db"`
}

// 获取配置信息
func (c *conf) getConf() *conf {
	// 读取 configs/application.yaml 文件
	yamlFile, err := ioutil.ReadFile("configs/application.yaml")
	// 如果读取失败，打印错误信息
	if err != nil {
		fmt.Println(err.Error())
	}
	// 将读取的内容解析到 conf 结构体中
	err = yaml.Unmarshal(yamlFile, c)
	if err != nil {
		fmt.Println(err.Error())
	}
	return c
}

// 初始化数据库连接，成功返回 nil，失败返回错误
func InitMySql() (err error) {
	var c conf
	// 获取配置信息
	c.getConf()
	// 打开数据库连接
	SqlSession, err = gorm.Open(DRIVER, c.ConnectUrl())
	if err != nil {
		panic(err)
	}
	// 验证数据库连接是否成功，成功返回 nil，失败返回错误
	return SqlSession.DB().Ping()
}

// 构建数据库连接字符串
func (c conf) ConnectUrl() string {
	return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		c.DB.UserName,
		c.DB.Password,
		c.DB.Host,
		c.DB.Port,
		c.DB.DbName,
	)
}

// 关闭数据库连接
func Close() {
	SqlSession.Close()
}
